/*******************************************************************************
 *
 * File:        KEYMAN.c
 * Progetto:    Robottino
 * Ambiente:    PIC32
 * Data:        19/03/2012
 * Autore:      M. Tili
 * Versione:    00.01
 *
 * Descrizione: 
 *   Modulo di controllo dei BOTTONI.
 *
 *
 * Modifica:  22/05/2012  | M.Tili
 *                        | Rimosse funzioni KeyManUpdtOneKey e KeyManBlinkLed.
 *                        | Rework funzione KeyManUpdate e KeyManInit.
 *
 */
#include "CONFIG.h"
#include "TYPEDEFS.h"
#include "GLOBVAR.h"
#include "TIMER.h"
#include "QUTIL.h"
#include "KEYMAN.h"


/*___DEFINIZIONE TIPI E VARIABILI PRIVATE_____________________________________*/

typedef enum {
  KEY_RELEASED = 0,
  KEY_IGNORE   = 1,
  KEY_PRESSED  = 2
} e_key_state;

typedef struct tkeystat {
  e_key_state  state;
  e_timer_id   timerId;
  e_led_id     ledId;
  e_led_cmd_id ledCmdId;
} t_key_stat;

static t_key_stat keyStat[KEY_ID_MAX] = {
  { KEY_RELEASED, TIMER_KEY00_TRANS, LED_ID_00, LED_CMD_BLINK  },
  { KEY_RELEASED, TIMER_KEY01_TRANS, LED_ID_01, LED_CMD_TOGGLE },
  { KEY_RELEASED, TIMER_KEY02_TRANS, LED_ID_02, LED_CMD_TOGGLE }
};


/*___DEFINIZIONE FUNZIONI PRIVATE_____________________________________________*/

/* none */

/*___FINE DELLE DEFINIZIONI___________________________________________________*/
/*============================================================================*/



/*******************************************************************************
 *
 *  KeyManInit
 *  Descrizione: Questa funzione inizializza i dati del modulo KEYMAN ed i timer
 *               associati.
 *
 */
void KeyManInit(void)
{
  int idx;
  for(idx=0;idx <KEY_ID_MAX;idx++)
  {
    keyStat[idx]=KEY_RELEASED;
  }
  TimerResetById(TIMER_KEY00_TRANS);
  TimerResetById(TIMER_KEY01_TRANS);
  TimerResetById(TIMER_KEY02_TRANS);
}



/*******************************************************************************
 *
 *  KeyManUpdate
 *  Descrizione: Questa funzione schedula l'aggiornamento dello stato dei 
 *               comandi sui BOTTONI. Se un bottone viene premuto, al suo 
 *               rilascio viene attivato il comando per il led (impostato nella
 *               tabella keyStat). Sempre al rilascio del bottone viene attivato
 *               un timer per l'antirimbalzo sul bottone.
 *
 */
void KeyManUpdate(void)
{
  int idx;
  for (idx=0; idx< KEY_ID_MAX; idx++)
  {
    switch (keyStat[idx].state)
    {
      case KEY_RELEASED:
        if (ioDataStat.input[idx] == STATE_HIGH)
        {
          keyStat[idx].state = KEY_PRESSED;
        }
        break;
      case KEY_PRESSED:
        if (ioDataStat.input[idx] == STATE_LOW)
        {
          keyStat[idx].state = KEY_IGNORE;
          TimerSet(keyStat[idx].timerId, 500, FALSE);
        }
        break;
      case KEY_IGNORE:
        LedManSetCmd(keyStat[idx].ledId, keyStat[idx].ledCmdId);
        if (TimerHasExpired(keyStat[idx].timerId) == TRUE)
        {
          TimerResetById(keyStat[idx].timerId);
          keyStat[idx].state = KEY_RELEASED;
        }
        break;
      default:
        break;
    }
  }
}

